/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto.web;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import proyecto.service.RequerimientoService;
import proyecto.modelo.Requerimiento;
import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.ClaseFormacion;
import proyecto.modelo.Area;
import proyecto.modelo.NivelFormacion;
import proyecto.modelo.Profesion;
import proyecto.modelo.Empleado;

/** 
 *
 * @author Administrador
 */
public class RequerimientoController extends MultiActionController {

    public RequerimientoController() {
        //Initialize controller properties here or 
        //in the Web Application Context
        //setCommandClass(MyCommand.class);
        //setCommandName("MyCommandName");
        //setSuccessView("successView");
        //setFormView("formView");
    }

    //@Override
    protected void doSubmitAction(Object command) throws Exception {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    //Use onSubmit instead of doSubmitAction 
    //when you need access to the Request, Response, or BindException objects
    /*
    @Override
    protected ModelAndView onSubmit(
    HttpServletRequest request,
    HttpServletResponse response,
    Object command,
    BindException errors) throws Exception {
    ModelAndView mv = new ModelAndView(getSuccessView());
    //Do something...
    return mv;
    }
     */
    private RequerimientoService requerimientoService;

    public RequerimientoService getRequerimientoService() {
        return requerimientoService;
    }

    public void setRequerimientoService(RequerimientoService requerimientoService) {
        this.requerimientoService = requerimientoService;
    }


    public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("/requerimiento_mantener");
    }
    
    public ModelAndView consulta(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("/consultar_requerimiento");
    }

    public ModelAndView buscar(HttpServletRequest request, HttpServletResponse response) {
        int codigo = Integer.parseInt(request.getParameter("codigo"));

        try {

            Collection<Requerimiento> requerimientos = requerimientoService.buscarPorCodigo(codigo);

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(requerimientos);
            out.println(tabla);
            out.close();

            request.setAttribute("requerimientos", requerimientos);
        } catch (IOException ex) {
            Logger.getLogger(RequerimientoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
        }
        return null;
    }

    public ModelAndView nuevo(HttpServletRequest request, HttpServletResponse response) {
        return new ModelAndView("/requerimiento_mantener");
    }

    public ModelAndView insertar(HttpServletRequest request, HttpServletResponse response) {
        Requerimiento vo = new Requerimiento();
        vo.setReq_Numero(Integer.parseInt(request.getParameter("codigo")));
        vo.setReq_EdadMinima(Integer.parseInt(request.getParameter("edadMinima")));
        vo.setReq_EdadMaxima(Integer.parseInt(request.getParameter("edadMaxima")));
        vo.setReq_AnioExperiencia(Integer.parseInt(request.getParameter("anioExper")));
        vo.setReq_Sustento(request.getParameter("sustento"));
        vo.setReq_TipoUrgencia(request.getParameter("tipoUrgencia"));
        vo.setReq_EstadoLaboral(request.getParameter("estadoLab"));
        vo.setReq_Sexo(request.getParameter("sexo"));

        //vo.setReq_FechaRegistro(Date.valueOf(request.getParameter("fechaLim")));


        Area area = new Area();
        area.setAre_Codigo(Integer.parseInt(request.getParameter("area")));

        ClaseFormacion claseFormacion = new ClaseFormacion();
        claseFormacion.setTipEst_Codigo(Integer.parseInt(request.getParameter("claseFormacion")));

        Profesion profesion = new Profesion();
        profesion.setPro_Codigo(Integer.parseInt(request.getParameter("profesion")));

        NivelFormacion nivelFormacion = new NivelFormacion();
        nivelFormacion.setNivFor_Codigo(Integer.parseInt(request.getParameter("nivelFormacion")));

        Empleado empleado = new Empleado();
        empleado.setEmp_Codigo(request.getParameter("empleado"));

        vo.setArea(area);
        vo.setClaseFormacion(claseFormacion);
        vo.setNivelFormacion(nivelFormacion);
        vo.setProfesion(profesion);
        vo.setEmpleado(empleado);

        try {
            requerimientoService.insertar(vo);

            Collection<Requerimiento> requerimientos = requerimientoService.listar();

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(requerimientos);
            out.println(tabla);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(RequerimientoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion e) {
            System.err.println(e.toString());
        }
        //buscar( request,  response);
        return new ModelAndView("redirect:/requerimiento_mantener.htm");
    }

    public ModelAndView eliminar(HttpServletRequest request, HttpServletResponse response) {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        try {
            requerimientoService.eliminar(codigo);

            Collection<Requerimiento> requerimientos = requerimientoService.listar();

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(requerimientos);
            out.println(tabla);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(RequerimientoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion ex) {
            System.err.println(ex.toString());
        }
        return new ModelAndView("redirect:/requerimiento_mantener.htm");
    }

    public ModelAndView obtener(HttpServletRequest request, HttpServletResponse response) {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        Requerimiento vo;
        try {
            vo = requerimientoService.obtener(codigo);

            //Construye el objeto JSON  a partir del objeto recuperado
            Gson gson = new GsonBuilder().setPrettyPrinting().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
            ArrayList objeto = new ArrayList(0);
            objeto.add(vo);
            String instancia = gson.toJson(objeto);

            PrintWriter out = response.getWriter();
            //Construye un objeto con los datos
            out.println(instancia);
            out.close();

            request.setAttribute("Requerimiento", vo);
        } catch (IOException ex) {
            Logger.getLogger(RequerimientoController.class.getName()).log(Level.SEVERE,
                    null, ex);

        } catch (DAOExcepcion e) {
            System.err.println("Error");
        }
        return new ModelAndView("redirect:/requerimiento_mantener.htm");
    }

    public ModelAndView actualizar(HttpServletRequest request, HttpServletResponse response) {

        Requerimiento vo = new Requerimiento();

        vo.setReq_Numero(Integer.parseInt(request.getParameter("codigo")));
        vo.setReq_EdadMinima(Integer.parseInt(request.getParameter("edadMinima")));
        vo.setReq_EdadMaxima(Integer.parseInt(request.getParameter("edadMaxima")));
        vo.setReq_AnioExperiencia(Integer.parseInt(request.getParameter("anioExper")));
        vo.setReq_Sustento(request.getParameter("sustento"));
        vo.setReq_TipoUrgencia(request.getParameter("tipoUrgencia"));
        vo.setReq_EstadoLaboral(request.getParameter("estadoLab"));
        vo.setReq_Sexo(request.getParameter("sexo"));

        //vo.setReq_FechaRegistro(Date.valueOf(request.getParameter("fechaLim")));


        Area area = new Area();
        area.setAre_Codigo(Integer.parseInt(request.getParameter("area")));

        ClaseFormacion claseFormacion = new ClaseFormacion();
        claseFormacion.setTipEst_Codigo(Integer.parseInt(request.getParameter("claseFormacion")));

        Profesion profesion = new Profesion();
        profesion.setPro_Codigo(Integer.parseInt(request.getParameter("profesion")));

        NivelFormacion nivelFormacion = new NivelFormacion();
        nivelFormacion.setNivFor_Codigo(Integer.parseInt(request.getParameter("nivelFormacion")));

        Empleado empleado = new Empleado();
        empleado.setEmp_Codigo(request.getParameter("empleado"));

        vo.setArea(area);
        vo.setClaseFormacion(claseFormacion);
        vo.setNivelFormacion(nivelFormacion);
        vo.setProfesion(profesion);
        vo.setEmpleado(empleado);


        try {
            requerimientoService.actualizar(vo);

            Collection<Requerimiento> requerimientos = requerimientoService.listar();

            PrintWriter out = response.getWriter();
            //Construye una tabla con los datos de la lista
            String tabla = doLLenarTabla(requerimientos);
            
            out.println(tabla);
            System.out.println(requerimientos);
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(RequerimientoController.class.getName()).log(Level.SEVERE,
                    null, ex);
        } catch (DAOExcepcion e) {
            System.err.println("Error");
        }
        return new ModelAndView("redirect:/requerimiento_mantener.htm");
    }

    private String doLLenarTabla(Collection<Requerimiento> requerimientos) {

        int codigo = 0;
        String fecha = "";
        String area = "";
        String profesion = "";


        String cabecera = "<table class='datos'>" +
                "<tr class='Estilo9 Estilo12'>" +
                "<th>C&oacute;digo</th>" +
                "<th>Fecha</th>" +
                "<th>Area</th>" +
                "<th>Profesion</th>" +
                "<th>&nbsp;</th>" +
                "<th>&nbsp;</th></tr>";

        String celdas = "";

        for (Requerimiento r : requerimientos) {
            codigo = r.getReq_Numero();
            fecha = "";
            //fecha = r.getReq_FechaRegistro().toString();
            area = r.getArea().getAre_Descripcion();
            profesion = r.getProfesion().getPro_Descripcion();

            celdas = celdas +
                    "<tr>" +
                    "<td ><span class=\"Estilo12\">" + codigo + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + fecha + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + area + "</span></td>" +
                    "<td ><span class=\"Estilo12\">" + profesion + "</span></td>" +
                    "<td><a onclick=\"return requerimientoObtener('" + codigo + "');\"><img src=\"imagenes/b_edit.gif\" alt=\"Editar\" title=\"Editar\" /></a></td>" +
                    "<td><a onclick=\"return requerimientoEliminar('" + codigo + "');\"><img src=\"imagenes/delete.png\" alt=\"Editar\" title=\"Editar\" /></a></td>" +
                    "</tr>";
        }
        String tabla = cabecera + celdas + "</table>";

        return tabla;
    }

}
